package com.vshop.service.aspecial;

import com.vshop.config.dto.ResultDataDto;
import com.vshop.entity.alast.common.ServicePlanOrderRecord;
import com.vshop.entity.aspecial.activate.request.RequestFirstOrder;
import com.vshop.entity.aspecial.order.request.RequestAccessOrder;
import com.vshop.entity.aspecial.querydevice.request.RequestQueryDevice;
import com.vshop.entity.aspecial.queryorder.request.RequestSpecialQueryOrder;

import java.util.List;

/**
 * 特殊的逻辑处理：所有的业务逻辑处理实现类
 * <p>
 * 现在代表客户：大阳
 *
 * @author lm
 * @date 2020/8/21 14:22
 */
public interface SpecialLogicService {

    /**
     * 设备实时信息查询接口:
     * <p>
     * 1，接口响应将返回卡片是否归属领科
     * <p>
     * 2，接口响应将返回卡片接下来是应该走订购的接口还是激活的接口
     * <p>
     * 返回格式是：{"data":{},"message":"string","operateCode":"string"},ResponseQueryDevice是data部分
     *
     * @param request
     * @return
     */
    ResultDataDto queryDevice(RequestQueryDevice request);

    /**
     * 订购套餐接口：
     * <p>
     * 1，领科卡片非首次订购套餐
     * <p>
     * 2，非领科卡片无论第几次代收服务费都叫订购套餐
     * <p>
     * 3，有支付的过程
     * <p>
     * 4，非领科卡片套餐是固定的。
     * <p>
     * 5，领科卡片还是按照现有逻辑订购
     * <p>
     * 返回格式是：{"data":{},"message":"string","operateCode":"string"},ResponseAccessOrder是data部分
     *
     * @param request
     * @return
     */
    ResultDataDto topUp(RequestAccessOrder request);

    /**
     * 激活接口：
     * <p>
     * 领科出卡只带一个赠送套餐首次来订购我们把这种情况定义为卡片激活:
     * <p>
     * 1，访问此接口直接异步为卡片订购套餐
     * <p>
     * 2，没有支付的过程
     * <p>
     * 3，套餐是固定的，是否需要给它做成动态的套餐。
     * <p>
     * 返回格式是：{"data":{},"message":"string","operateCode":"string"},ResponseFirstOrder是data部分
     *
     * @param request
     * @return
     */
    ResultDataDto activate(RequestFirstOrder request);

    /**
     * 查询设备的订单接口：
     * <p>
     * 1，领科卡片用接口去北京查询
     * <p>
     * 2，非领科卡片在深圳的数据库里面匹配
     * <p>
     * 3，两种卡片的订单信息尽量参数要做到统一
     * <p>
     * 返回格式是：{"data":{},"message":"string","operateCode":"string"},ResponseSpecialQueryOrder是data部分
     *
     * @param request
     * @return
     */

    ResultDataDto queryOrder(RequestSpecialQueryOrder request);

    /**
     * 根据企业编码去查询数据库里面需要给企业推送的订单数据
     *
     * @param partnerCode
     * @return
     */
    List<ServicePlanOrderRecord> queryChannelResultPushOrderWithCode(String partnerCode);

    /**
     * 根据企业编码去查询数据库里面需要给企业推送的订单数据
     *
     * @param codeList
     * @return
     */
    List<ServicePlanOrderRecord> queryChannelResultPushOrderWithCodeList(List<String> codeList);

    /**
     * 根据企业和设备和第三方自己的订单id去查询回调noticeUrl
     *
     * @param partnerCode
     * @param deviceCode
     * @param requestOrderId
     * @return
     */
    String queryNoticeUrl(String partnerCode, String deviceCode, String requestOrderId);

    /**
     * 更新推送某条记录的提示状态
     *
     * @param partnerCode
     * @param deviceCode
     * @param payId
     * @param orderNo
     * @return
     */
    Integer updateNoticeRecord(String partnerCode, String deviceCode, String payId, String orderNo);
}
